from flask import request, jsonify
from flask_jwt_extended import jwt_required
import datetime
from bson import ObjectId

from app.api.v1 import api_bp
from app import mongo
from app.utils.auth import permission_required
from app.schemas.role import RoleSchema, RoleUpdateSchema
from app.utils.common import normalize_data, paginate

@api_bp.route('/roles', methods=['GET'])
@jwt_required()
@permission_required('role:read')
def get_roles():
    """获取角色列表"""
    # 获取查询参数
    page = request.args.get('page', 1, type=int)
    limit = request.args.get('limit', 20, type=int)
    sort_by = request.args.get('sortBy', 'createdAt')
    order = request.args.get('order', 'desc')
    
    # 构建查询条件
    query = {}
    
    # 按名称筛选
    name = request.args.get('name')
    if name:
        query['name'] = {'$regex': name, '$options': 'i'}
    
    # 按状态筛选
    status = request.args.get('status')
    if status and status != 'all':
        query['status'] = status
    
    # 确定排序
    sort_direction = -1 if order.lower() == 'desc' else 1
    
    # 获取数据
    roles_cursor = mongo.db.roles.find(query).sort(sort_by, sort_direction)
    
    # 分页
    paginated_data = paginate(roles_cursor, page, limit)
    
    # 标准化数据
    roles = [normalize_data(role) for role in paginated_data['items']]
    
    return jsonify({
        'success': True,
        'data': {
            'total': paginated_data['total'],
            'page': paginated_data['page'],
            'limit': paginated_data['per_page'],
            'roles': roles
        }
    }), 200

@api_bp.route('/roles/<id>', methods=['GET'])
@jwt_required()
@permission_required('role:read')
def get_role(id):
    """获取角色详情"""
    # 查询角色
    role = None
    if ObjectId.is_valid(id):
        role = mongo.db.roles.find_one({'_id': ObjectId(id)})
    
    if not role:
        role = mongo.db.roles.find_one({'name': id})
    
    if not role:
        return jsonify({
            'success': False,
            'message': '角色不存在'
        }), 404
    
    # 标准化数据
    normalized_role = normalize_data(role)
    
    return jsonify({
        'success': True,
        'data': normalized_role
    }), 200

@api_bp.route('/roles', methods=['POST'])
@jwt_required()
@permission_required('role:create')
def create_role():
    """创建角色"""
    # 验证请求数据
    schema = RoleSchema()
    errors = schema.validate(request.json)
    if errors:
        return jsonify({
            'success': False,
            'message': '请求数据验证失败',
            'errors': errors
        }), 400
    
    data = request.json
    
    # 检查角色名是否已存在
    if mongo.db.roles.find_one({'name': data['name']}):
        return jsonify({
            'success': False,
            'message': '角色名已存在'
        }), 400
    
    # 添加创建时间和更新时间
    now = datetime.datetime.utcnow()
    data['createdAt'] = now
    data['updatedAt'] = now
    
    # 如果没有设置状态，默认为启用
    if 'status' not in data:
        data['status'] = '启用'
    
    # 保存到数据库
    result = mongo.db.roles.insert_one(data)
    
    return jsonify({
        'success': True,
        'message': '角色创建成功',
        'data': {
            'id': str(result.inserted_id),
            'name': data['name'],
            'displayName': data.get('displayName', data['name']),
            'createdAt': now.isoformat()
        }
    }), 201

@api_bp.route('/roles/<id>', methods=['PUT'])
@jwt_required()
@permission_required('role:update')
def update_role(id):
    """更新角色"""
    # 查询角色
    role = None
    if ObjectId.is_valid(id):
        role = mongo.db.roles.find_one({'_id': ObjectId(id)})
    
    if not role:
        return jsonify({
            'success': False,
            'message': '角色不存在'
        }), 404
    
    # 验证请求数据
    schema = RoleUpdateSchema()
    errors = schema.validate(request.json)
    if errors:
        return jsonify({
            'success': False,
            'message': '请求数据验证失败',
            'errors': errors
        }), 400
    
    data = request.json
    
    # 检查角色名是否已存在（如果有更改）
    if 'name' in data and data['name'] != role['name']:
        if mongo.db.roles.find_one({'name': data['name']}):
            return jsonify({
                'success': False,
                'message': '角色名已存在'
            }), 400
    
    # 更新时间
    data['updatedAt'] = datetime.datetime.utcnow()
    
    # 更新数据库
    mongo.db.roles.update_one({'_id': ObjectId(id)}, {'$set': data})
    
    return jsonify({
        'success': True,
        'message': '角色更新成功',
        'data': None
    }), 200

@api_bp.route('/roles/<id>', methods=['DELETE'])
@jwt_required()
@permission_required('role:delete')
def delete_role(id):
    """删除角色"""
    # 查询角色
    role = None
    if ObjectId.is_valid(id):
        role = mongo.db.roles.find_one({'_id': ObjectId(id)})
    
    if not role:
        return jsonify({
            'success': False,
            'message': '角色不存在'
        }), 404
    
    # 检查是否有用户使用该角色
    users_count = mongo.db.users.count_documents({'role': role['name']})
    if users_count > 0:
        return jsonify({
            'success': False,
            'message': f'无法删除角色，当前有{users_count}个用户使用该角色'
        }), 400
    
    # 删除数据库中的角色
    mongo.db.roles.delete_one({'_id': ObjectId(id)})
    
    return jsonify({
        'success': True,
        'message': '角色删除成功',
        'data': None
    }), 200

@api_bp.route('/permissions', methods=['GET'])
@jwt_required()
@permission_required('role:read')
def get_permissions():
    """获取所有权限列表"""
    # 系统预定义的所有权限
    permissions = [
        # 用户管理权限
        {'code': 'user:read', 'name': '查看用户', 'description': '查看用户信息'},
        {'code': 'user:create', 'name': '创建用户', 'description': '创建新用户'},
        {'code': 'user:update', 'name': '更新用户', 'description': '更新用户信息'},
        {'code': 'user:delete', 'name': '删除用户', 'description': '删除用户'},
        
        # 角色管理权限
        {'code': 'role:read', 'name': '查看角色', 'description': '查看角色信息'},
        {'code': 'role:create', 'name': '创建角色', 'description': '创建新角色'},
        {'code': 'role:update', 'name': '更新角色', 'description': '更新角色信息'},
        {'code': 'role:delete', 'name': '删除角色', 'description': '删除角色'},
        
        # 患者管理权限
        {'code': 'patient:read', 'name': '查看患者', 'description': '查看患者信息'},
        {'code': 'patient:create', 'name': '创建患者', 'description': '创建新患者'},
        {'code': 'patient:update', 'name': '更新患者', 'description': '更新患者信息'},
        {'code': 'patient:delete', 'name': '删除患者', 'description': '删除患者'},
        
        # 医疗记录权限
        {'code': 'medical_record:read', 'name': '查看病历', 'description': '查看病历信息'},
        {'code': 'medical_record:create', 'name': '创建病历', 'description': '创建新病历'},
        {'code': 'medical_record:update', 'name': '更新病历', 'description': '更新病历信息'},
        {'code': 'medical_record:delete', 'name': '删除病历', 'description': '删除病历'},
        
        # 药品管理权限
        {'code': 'drug:read', 'name': '查看药品', 'description': '查看药品信息'},
        {'code': 'drug:create', 'name': '创建药品', 'description': '创建新药品'},
        {'code': 'drug:update', 'name': '更新药品', 'description': '更新药品信息'},
        {'code': 'drug:delete', 'name': '删除药品', 'description': '删除药品'},
        
        # 药品库存管理权限
        {'code': 'drug_inventory:read', 'name': '查看药品库存', 'description': '查看药品库存信息'},
        {'code': 'drug_inventory:create', 'name': '入库药品', 'description': '药品入库操作'},
        {'code': 'drug_inventory:update', 'name': '更新库存', 'description': '更新药品库存信息'},
        {'code': 'drug_inventory:delete', 'name': '删除库存', 'description': '删除药品库存记录'},
        
        # 处方管理权限
        {'code': 'prescription:read', 'name': '查看处方', 'description': '查看处方信息'},
        {'code': 'prescription:create', 'name': '创建处方', 'description': '创建新处方'},
        {'code': 'prescription:update', 'name': '更新处方', 'description': '更新处方信息'},
        {'code': 'prescription:delete', 'name': '删除处方', 'description': '删除处方'},
        {'code': 'prescription:audit', 'name': '审核处方', 'description': '审核处方'},
        {'code': 'prescription:dispense', 'name': '发药', 'description': '处方发药操作'},
        
        # 医生管理权限
        {'code': 'doctor:read', 'name': '查看医生', 'description': '查看医生信息'},
        {'code': 'doctor:create', 'name': '创建医生', 'description': '创建新医生'},
        {'code': 'doctor:update', 'name': '更新医生', 'description': '更新医生信息'},
        {'code': 'doctor:delete', 'name': '删除医生', 'description': '删除医生'},
        
        # 科室管理权限
        {'code': 'department:read', 'name': '查看科室', 'description': '查看科室信息'},
        {'code': 'department:create', 'name': '创建科室', 'description': '创建新科室'},
        {'code': 'department:update', 'name': '更新科室', 'description': '更新科室信息'},
        {'code': 'department:delete', 'name': '删除科室', 'description': '删除科室'},
        
        # 预约管理权限
        {'code': 'appointment:read', 'name': '查看预约', 'description': '查看预约信息'},
        {'code': 'appointment:create', 'name': '创建预约', 'description': '创建新预约'},
        {'code': 'appointment:update', 'name': '更新预约', 'description': '更新预约信息'},
        {'code': 'appointment:delete', 'name': '删除预约', 'description': '删除预约'},
        
        # 排班管理权限
        {'code': 'schedule:read', 'name': '查看排班', 'description': '查看排班信息'},
        {'code': 'schedule:create', 'name': '创建排班', 'description': '创建新排班'},
        {'code': 'schedule:update', 'name': '更新排班', 'description': '更新排班信息'},
        {'code': 'schedule:delete', 'name': '删除排班', 'description': '删除排班'},
        
        # 医嘱管理权限
        {'code': 'medical_order:read', 'name': '查看医嘱', 'description': '查看医嘱信息'},
        {'code': 'medical_order:create', 'name': '创建医嘱', 'description': '创建新医嘱'},
        {'code': 'medical_order:update', 'name': '更新医嘱', 'description': '更新医嘱信息'},
        {'code': 'medical_order:delete', 'name': '删除医嘱', 'description': '删除医嘱'},
        {'code': 'medical_order:execute', 'name': '执行医嘱', 'description': '执行医嘱操作'},
        
        # 报表管理权限
        {'code': 'report:read', 'name': '查看报表', 'description': '查看报表信息'},
        {'code': 'report:create', 'name': '创建报表', 'description': '创建新报表'},
        {'code': 'report:update', 'name': '更新报表', 'description': '更新报表信息'},
        {'code': 'report:delete', 'name': '删除报表', 'description': '删除报表'},
        {'code': 'report:generate', 'name': '生成报表', 'description': '手动生成报表'},
        
        # 文件管理权限
        {'code': 'file:read', 'name': '查看文件', 'description': '查看文件信息'},
        {'code': 'file:upload', 'name': '上传文件', 'description': '上传新文件'},
        {'code': 'file:delete', 'name': '删除文件', 'description': '删除文件'},
        
        # 系统管理权限
        {'code': 'system:settings', 'name': '系统设置', 'description': '修改系统设置'},
        {'code': 'system:logs', 'name': '系统日志', 'description': '查看系统日志'}
    ]
    
    return jsonify({
        'success': True,
        'data': permissions
    }), 200 